EC2 WindowsインスタンスにCloudWatchエージェントをインストールして稼働させる
WindowsインスタンスにCloudWatchエージェントを導入してみます。 カスタムメトリクスやイベントログ/テキストログを CloudWatch コンソールから確認できるようにします。
今回は多くのインスタンスへ適用することを想定して、なるべく AWS CLIで完結するように設定していきます。
前提条件
対象のWindowsインスタンスが Systems Manager(SSM)管理下であることが前提条件です。
具体的にどのような前提条件があるのかは以下を参照ください。
今回は以下のような設定で Windowsインスタンスを作成します。
- AMI … SSMエージェントがプリインストールされている Windows AMI
- ネットワーク … アウトバウンド通信が可能
- IAMロール … AmazonSSMManagedInstanceCore および CloudWatchAgentServerPolicy がアタッチされている
導入してみる
[準備] Windowsインスタンスを起動する
今回の検証用に Windows インスタンスを作成します。 Microsoft Windows Server 2022 Base
AMI を選択しました。
SSMフリートマネージャーから、SSM管理下であることを確認します。
CloudWatchエージェントをインストールする
今回は SSM Run Command を使います。 Run Command はインスタンスへSSH or RDP接続せずに、 各種操作を行える機能です。
Run Command で使うSSMドキュメントは「AWS-ConfigureAWSPackage」です。 このSSMドキュメントを使うと、 各種パッケージのインストール/アンインストールが簡単に実行できます。
以降、AWS CloudShellから実行していきます。
##### EC2インスタンスのNameタグ値 instance_name="windows-test" echo "- Instance Name: ${instance_name}" # - Instance Name: windows-test ##### EC2インスタンスIDを取得 instance_id=$(aws ec2 describe-instances --output text \ --filters Name="tag:Name",Values="${instance_name}" \ --query "Reservations[].Instances[0].InstanceId") echo "- Instance ID: ${instance_id}" # - Instance ID: i-0535example ##### CloudWatchエージェントのインストール by SSM Run Command aws ssm send-command --output yaml \ --instance-ids "${instance_id}" \ --document-name "AWS-ConfigureAWSPackage" \ --parameters name="AmazonCloudWatchAgent",action="Install" # Command: # AlarmConfiguration: # Alarms: [] # IgnorePollAlarmFailure: false # CloudWatchOutputConfig: # CloudWatchLogGroupName: '' # CloudWatchOutputEnabled: false # CommandId: 262c6b05-8081-4361-80ef-890954186860 # ... (略)
その後 SSM Run Command コンソールから実行成功を確認します。
CloudWatchエージェント設定ファイルを作成する
今回は以下のような設定ファイルとします。
- テキストログ
- SSMエージェントのログを "/WindowsTextLog/amazon-ssm-agent.log" へ送信
- イベントログ
- システムログの Error, Critical を "/WindowsEventLog/System" へ送信
- セキュリティログの Error, Critical を "/WindowsEventLog/Security" へ送信
- アプリケーションログの Error, Critical を "/WindowsEventLog/Application" へ送信
- カスタムメトリクス
- ディスク容量をカスタムメトリクスとして発行
- メモリ使用量をカスタムメトリクスとして発行
- SSMエージェントのプロセスメトリクスを発行
※今回は手動で設定ファイルを作成しましたが、 設定ファイルを作成するウィザードも活用できます。 詳細はこちらを参照ください。
作成したJSONがこちら。
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "C:\\ProgramData\\Amazon\\SSM\\Logs\\amazon-ssm-agent.log", "log_group_name": "/WindowsTextLog/amazon-ssm-agent.log", "log_stream_name": "{instance_id}", "retention_in_days": 90 } ] }, "windows_events": { "collect_list": [ { "event_format": "xml", "event_levels": [ "ERROR", "CRITICAL" ], "event_name": "System", "log_group_name": "/WindowsEventLog/System", "log_stream_name": "{instance_id}", "retention_in_days": 90 }, { "event_format": "xml", "event_levels": [ "ERROR", "CRITICAL" ], "event_name": "/WindowsEventLog/Application", "log_group_name": "Application", "log_stream_name": "{instance_id}", "retention_in_days": 90 }, { "event_format": "xml", "event_levels": [ "ERROR", "CRITICAL" ], "event_name": "/WindowsEventLog/Security", "log_group_name": "Security", "log_stream_name": "{instance_id}", "retention_in_days": 90 } ] } } }, "metrics": { "aggregation_dimensions": [ [ "InstanceId" ] ], "append_dimensions": { "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}", "AutoScalingGroupName": "${aws:AutoScalingGroupName}" }, "metrics_collected": { "LogicalDisk": { "measurement": [ "% Free Space" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "Memory": { "measurement": [ "% Committed Bytes In Use" ], "metrics_collection_interval": 60 }, "procstat": [ { "exe": "amazon-ssm-agent.exe", "measurement": [ "pid_count" ], "metrics_collection_interval": 60 } ] } } }
これを SSMパラメータストアに登録します。
IAMロール権限として CloudWatchAgentServerPolicy を使っている場合は パラメータ名に制約がある点に注意です。 AmazonCloudWatch-
から始まるパラメータのみ取得可能です。
今回は AmazonCloudWatch-windows-test
パラメータを作成しました。
CloudWatchエージェントを起動する
こちらも SSM Run Commandを活用します。 使うSSMドキュメントは「AmazonCloudWatch-ManageAgent」です。 指定した設定ファイルをベースに、CloudWatchエージェントを起動させます。
以下 CloudShellから実行しました。
##### EC2インスタンスのNameタグ値 instance_name="windows-test" echo "- Instance Name: ${instance_name}" # - Instance Name: windows-test ##### EC2インスタンスIDを取得 instance_id=$(aws ec2 describe-instances --output text \ --filters Name="tag:Name",Values="${instance_name}" \ --query "Reservations[].Instances[0].InstanceId") echo "- Instance ID: ${instance_id}" # - Instance ID: i-0535example ##### CloudWatchエージェントの起動 by SSM Run Command aws ssm send-command --output yaml \ --instance-ids $instance_id \ --document-name "AmazonCloudWatch-ManageAgent" \ --parameters \ action="configure",mode="ec2",\ optionalConfigurationSource="ssm",\ optionalConfigurationLocation="AmazonCloudWatch-${instance_name}",\ optionalRestart="yes" # Command: # AlarmConfiguration: # Alarms: [] # IgnorePollAlarmFailure: false # CloudWatchOutputConfig: # CloudWatchLogGroupName: '' # CloudWatchOutputEnabled: false # CommandId: 1157fbfd-5a30-47c5-b808-ff29d524ac27 # ... (略)
その後 SSM Run Command コンソールから実行成功を確認します。
メトリクス・ログを確認する
テキストログ
"/WindowsTextLog/amazon-ssm-agent.log" へログ発行されていることを確認しました。
イベントログ
今回は Error と Critical に絞っていましたが、 "/WindowsEventLog/System" にていくつか観測できました。
カスタムメトリクス
ディスク空き容量とメモリ使用率のカスタムメトリクスを確認できました。
また設定したプロセスメトリクス(SSMエージェントのプロセス状態)も確認できました。
おわりに
Windowsインスタンス上にCloudWatchエージェントを稼働させてみました。
取得したかったメトリクス(メモリ使用量やプロセス)、ログ(イベントログやアプリログ) をCloudWatchへ集約することができました。
以上、参考になれば幸いです。
参考
- CloudWatch エージェントを使用して Amazon EC2 インスタンスとオンプレミスサーバーからメトリクス、ログ、トレースを収集する - Amazon CloudWatch
- AWS Systems Manager を使用した CloudWatch エージェントのインストール - Amazon CloudWatch
- CloudWatch エージェント設定ファイルを手動で作成または編集する - Amazon CloudWatch
- CloudWatch エージェントのトラブルシューティング - Amazon CloudWatch
- Amazon CloudWatchでWindowsのプロセス監視をしてみた | DevelopersIO
- CloudWatch で Windows のプロセス監視をする準備に役立つかも知れない PowerShell コマンド | DevelopersIO